package la.iok.hzsvn.lewin.movie.service;

import la.iok.hzsvn.lewin.movie.core.Token;
import la.iok.hzsvn.lewin.movie.entity.MovieScene;
import la.iok.hzsvn.lewin.movie.model.DigestInfo;
import la.iok.hzsvn.lewin.movie.model.MovieSceneParam;
import la.iok.hzsvn.lewin.movie.model.MovieSceneVo;
import la.iok.hzsvn.lewin.movie.model.ObsSignedUrl;
import la.iok.hzsvn.lewin.mybatis.service.BaseService;
import la.iok.hzsvn.share.annotations.NotNull;
import la.iok.hzsvn.share.annotations.NotNullElement;
import la.iok.hzsvn.share.annotations.Nullable;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.util.List;

public interface MovieSceneService extends BaseService<MovieScene,Long> {
    /**
     * 保存剧幕
     * @param token 操作用户
     * @param movieId 剧本id
     * @param param 剧幕信息
     * @return 新增记录id
     */
    @NotNull
    Long save(@NotNull Token token, @NotNull Long movieId, @NotNull MovieSceneParam param);

    /**
     * 上传文件
     * @param token 操作用户
     * @param id 剧幕id
     * @param file 文件
     */
    void uploadFile(@NotNull Token token, @NotNull Long id, MultipartFile file);

    /**
     * 上传文件摘要返回签名的存储文件url
     * @param token 操作用户
     * @param id 剧本id
     * @param digest 文件摘要
     * @return 签名的存储文件url
     */
    ObsSignedUrl uploadFile(@NotNull Token token, @NotNull Long id, @NotNull DigestInfo digest);

    /**
     * 查询剧幕文件的摘要信息
     * @param id 剧幕id
     * @return 摘要信息
     */
    @Nullable
    String digest(@Nullable Long id);

    /**
     * 查询剧幕文件的摘要信息
     * @param id 剧幕id
     * @return 摘要信息
     */
    @Nullable
    String storePath(@Nullable Long id);
    /**
     * 修改剧幕信息
     * @param token 操作用户
     * @param id 剧幕id
     * @param param 剧幕信息
     */
    void update(@NotNull Token token, @NotNull Long id, @NotNull MovieSceneParam param);

    /**
     * 删除剧幕
     * @param token 操作用户
     * @param id 剧幕id
     */
    void delete(@NotNull Token token, @Nullable Long id);

    /**
     * 查询剧本的所有剧幕
     * @param token 操作用户
     * @param movieId 剧本id
     * @return 剧幕列表
     */
    @NotNull
    @NotNullElement
    List<MovieSceneVo> movieScenes(@NotNull Token token, @NotNull Long movieId);

    /**
     * 剧本的所有剧幕。此方法只负责查询，不管权限
     * @param movieId 剧本id
     * @return 剧幕列表
     */
    @NotNull
    @NotNullElement
    List<MovieScene> movieScenes(@Nullable Long movieId);

    /**
     * 验证用户对剧幕的操作权限
     * @param token 操作用户
     * @param id 剧幕id
     * @return 剧幕信息
     */
    @NotNull
    MovieScene validate(@NotNull Token token, @NotNull Long id);

    /**
     * 下载剧幕文件
     * @param token 操作用户
     * @param response 响应
     * @param id 剧幕id
     */
    void downloadFile(@NotNull Token token, @NotNull HttpServletResponse response, @NotNull Long id);

    ObsSignedUrl obsGet(@NotNull Token token, Long id);
}
